home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
gamesrc
/
arasan_s
/
attacks.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-14
|
6KB
|
272 lines
// Copyright 1993 by Jon Dart. All Rights Reserved.
#include "attacks.h"
#include "bearing.h"
#ifndef WINDOWS
#include <iostream.h>
#endif
void
Attacks::clear()
{
for (int i = 0; i < 64; i++)
{
my_attacks[i][White].clear();
my_attacks[i][Black].clear();
}
}
Attacks::Attacks()
{
clear();
}
unsigned
Attacks::pawn_attacks(const Square & sq, const ColorType side) const
{
if (sq.OnBoard())
return my_attacks[sq][side].num_attacks(Piece::Pawn);
else
return 0;
}
void
Attacks::compute_attacks(const Board & board, const ColorType side)
// initial computation of attack info
{
for (int i = 0; i < 16; i++)
{
Square sq(board.PiecePos(side, i));
if (!sq.IsInvalid())
add_attacks(board, sq, side);
}
}
void
Attacks::add_attacks(const Board & board,
const Square & sq, const ColorType side)
{
static Square squares[Bearing::MaxBearSq];
Piece source(board[sq]);
int n = Bearing::Attack_or_Defend(board, sq, squares);
for (int j = 0; j < n; j++)
{
Square sq2(squares[j]);
add_attack(sq2, source, side);
}
}
static const int BishopInverseDirection[4] = { 3, 2, 1, 0 };
static const int RookInverseDirection[4] = { 1, 0, 3, 2 };
void
Attacks::add_discovered_attacks(const Board & board,
const Square & sq, const Square & dest_square)
{
for (int i = 0; i < 4; i++)
{
const byte *data = RookSquares[sq] + (8*i);
Square sq2;
for (;;)
{
if (*data == 255 || (sq2 = *data++) == dest_square)
break;
Piece piece(board[sq2]);
if (!piece.IsEmpty())
{
if (piece.Type() == Piece::Rook ||
piece.Type() == Piece::Queen)
{
Square sq3;
const byte *data2 =
RookSquares[sq] + (8*RookInverseDirection[i]);
for (;;)
{
if ((sq3 = *data2++) == 255)
break;
Piece piece3(board[sq3]);
if (piece3.IsEmpty())
{
add_attack(sq3, piece, piece.Color());
if (sq3 == dest_square)
break;
}
else
{
add_attack(sq3, piece, piece.Color());
break;
}
}
}
break;
}
}
data = BishopSquares[sq] + (8*i);
sq2 = sq;
for (;;)
{
if (*data == 255 || (sq2 = *data++) == dest_square)
break;
Piece piece(board[sq2]);
if (!piece.IsEmpty())
{
if (piece.Type() == Piece::Queen ||
piece.Type() == Piece::Bishop)
{
Square sq3;
const byte *data2 =
BishopSquares[sq] + (8*BishopInverseDirection[i]);
for (;;)
{
if ((sq3 = *data2++) == 255)
break;
Piece piece3(board[sq3]);
if (piece3.IsEmpty())
{
add_attack(sq3, piece, piece.Color());
if (sq3 == dest_square)
break;
}
else
{
add_attack(sq3, piece, piece.Color());
break;
}
}
}
break;
}
}
}
}
void
Attacks::remove_attacks(const Board & board,
const Square & sq, const ColorType side)
{
static Square squares[Bearing::MaxBearSq];
Piece source(board[sq]);
int n = Bearing::Attack_or_Defend(board, sq, squares);
for (int j = 0; j < n; j++)
{
Square sq2(squares[j]);
remove_attack(sq2, source, side);
}
}
void
Attacks::remove_discovered_attacks(const Board & board,
const Square & sq, const Square & start_square)
{
for (int i = 0; i < 4; i++)
{
Square sq2(sq);
const byte *data = RookSquares[sq] + (8*i);
for (;;)
{
if (*data == 255 || (sq2 = *data++) == start_square)
break;
Piece piece(board[sq2]);
if (!piece.IsEmpty())
{
if (piece.Type() == Piece::Rook ||
piece.Type() == Piece::Queen)
{
const byte *data2 =
RookSquares[sq] + (8*RookInverseDirection[i]);
Square sq3(sq);
for (;;)
{
if ((sq3 = *data2++) == 255)
break;
else if (sq3 == start_square)
{
remove_attack(sq3, piece, piece.Color());
break;
}
Piece piece3(board[sq3]);
if (piece3.IsEmpty())
remove_attack(sq3, piece, piece.Color());
else
{
remove_attack(sq3, piece, piece.Color());
break;
}
}
}
break;
}
}
sq2 = sq;
data = BishopSquares[sq] + (8*i);
for (;;)
{
if (*data == 255 || (sq2 = *data++) == start_square)
break;
Piece piece(board[sq2]);
if (!piece.IsEmpty())
{
if (piece.Type() == Piece::Queen ||
piece.Type() == Piece::Bishop)
{
Square sq3;
const byte *data2 =
BishopSquares[sq] + (8*BishopInverseDirection[i]);
for (;;)
{
if ((sq3 = *data2++) == 255)
break;
else if (sq3 == start_square)
{
remove_attack(sq3, piece, piece.Color());
break;
}
Piece piece3(board[sq3]);
if (piece3.IsEmpty())
remove_attack(sq3, piece, piece.Color());
else
{
remove_attack(sq3, piece, piece.Color());
break;
}
}
}
break;
}
}
}
}
#if !defined(WINDOWS) && defined(DEBUG_ATTACKS)
void
Attacks::dump_attacks()
{
int i;
int j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
Square sq(j + 1, i + 1, Black);
cout << " [" << my_attacks[sq][White] << "," <<
my_attacks[sq][Black] << "]";
}
cout << endl;
}
}
#endif
#ifdef DEBUG_ATTACKS
int Attacks::operator == (const Attacks &a) const
{
for (int i = 0; i < 64; ++i)
{
if (my_attacks[i][White] != a.my_attacks[i][White])
return False;
if (my_attacks[i][Black] != a.my_attacks[i][Black])
return False;
}
return True;
}
#endif